package com.hera.base.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.hera.base.util.Inject;
import com.hera.base.util.MantenimientoListener;
import com.hera.base.util.VaadinUtil;
import com.vaadin.event.ShortcutAction.KeyCode;
import com.vaadin.server.Page;
import com.vaadin.server.ThemeResource;
import com.vaadin.server.VaadinSession;
import com.vaadin.ui.AbsoluteLayout;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.JavaScript;
import com.vaadin.ui.Label;
import com.vaadin.ui.Notification;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;


public abstract class BaseUI extends CustomComponent {

	private static final long serialVersionUID = 1L;
	
	private static Logger log = Logger.getLogger(BaseUI.class);

	protected abstract void postConstruct();
	
	@Autowired
	protected MessageSource messageSource;

	
	protected String getMensaje(String key,Object ...parametros){
		String defaultMessage = "Mensaje no especificado";
		return messageSource.getMessage(key, parametros, defaultMessage, getLocale());
	}
	
	
	protected void setDatoUsuarioLogin(Object user){
		try{
			VaadinSession.getCurrent().getLockInstance().lock();
			VaadinSession.getCurrent().setAttribute("USUARIO", user);
		}finally{
			VaadinSession.getCurrent().getLockInstance().unlock();
		}
	}
	
	protected Object getDatoUsuarioLogin(){
		return VaadinSession.getCurrent().getAttribute("USUARIO");
	}

	protected HttpSession getHttpSession(){
		ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
		HttpServletRequest request = requestAttributes.getRequest();
		HttpSession session = request.getSession(false);
		
		return session;
	}

	
	public BaseUI() {
		super();
		Inject.inject(this);
		log.info("INICIAR BaseUI");
	}

	@Override
	public void attach() {
		super.attach();
		postConstruct();
		UI.getCurrent().getPage().setTitle("HERA Aplicacion");
		debugId();
		JavaScript.getCurrent().execute("$(document).ready(function() { aplicarValidaciones(); });");
		log.info("INICIAR attach");
	}
	
	protected void debugId(){
		VaadinUtil.aplicarReflexionId(this);
	}
	
	public void notificar(String codigoMensaje,Object ... parametro){
		String defaultMessage ="Mensaje no especificado";
		String mensaje = "<br/>"+messageSource.getMessage(codigoMensaje,parametro,defaultMessage, this.getLocale());
		
		Notification notification = new Notification("Informativo", mensaje,Notification.Type.HUMANIZED_MESSAGE);
        notification.setDelayMsec(15);
        notification.show(Page.getCurrent());
		
	}
	

	protected HorizontalLayout generarEditarEliminar(Object data,final MantenimientoListener mantenimientoListener){
		HorizontalLayout lytBotonAccion = new HorizontalLayout();
		Button btnEditar = new Button();
		btnEditar.setStyleName("link");
		btnEditar.setDescription("Editar");
		btnEditar.setIcon(new ThemeResource("images/Lapiz.png"));
		btnEditar.setData(data);
		btnEditar.addClickListener(new ClickListener() {
			private static final long serialVersionUID = 1L;
			public void buttonClick(ClickEvent event) {
				mantenimientoListener.editarClickListener(event);
			}
		});
		
		Button btnEliminar = new Button();
		btnEliminar.setStyleName("link");
		btnEliminar.setDescription("Eliminar");
		btnEliminar.setIcon(new ThemeResource("images/Eliminar.png"));
		btnEliminar.setData(data);
		
		btnEliminar.addClickListener(new ClickListener() {
			private static final long serialVersionUID = 1L;
			public void buttonClick(ClickEvent event) {
				Window  modalConfimacion = new Window("¡MENSAJE ELIMINAR!");
				modalConfimacion.center();
				modalConfimacion.setModal(true);
				modalConfimacion.setClosable(false);
				modalConfimacion.setResizable(false);
				modalConfimacion.setDraggable(false);
				AbsoluteLayout lytMascaraEliminar = new AbsoluteLayout();
				lytMascaraEliminar.setWidth("260px");
				lytMascaraEliminar.setHeight("100px");
				VerticalLayout lytContenedorEliminar = new VerticalLayout();
				lytContenedorEliminar.setMargin(true);
				HorizontalLayout lytMensaje = new HorizontalLayout();
				HorizontalLayout lytBotones = new HorizontalLayout();
				lytBotones.setSpacing(true);
				lytBotones.setMargin(true);
				Label lblMensajeEliminar = new Label("¿Seguro que desea eliminar el registro?");
				Button btnAfirmacion = new Button();
				Button btnNegacion = new Button();
				btnAfirmacion.setCaption("Si");
				btnNegacion.setCaption("No");
				btnAfirmacion.setData(event.getButton().getData());
				btnAfirmacion.addClickListener(new ClickListener() {
					private static final long serialVersionUID = 1L;
					public void buttonClick(ClickEvent event) {						
						mantenimientoListener.eliminarClickListener(event);
						((Window)event.getButton().getParent().getParent().getParent().getParent()).close();
					}
				});
				btnNegacion.addClickListener(new ClickListener() {
					private static final long serialVersionUID = 1L;
					public void buttonClick(ClickEvent event) {
						((Window)event.getButton().getParent().getParent().getParent().getParent()).close();
					}
				});
				
				lytMensaje.addComponent(lblMensajeEliminar);
				lytBotones.addComponent(btnAfirmacion);
				lytBotones.addComponent(btnNegacion);
				lytContenedorEliminar.addComponent(lytMensaje);
				lytContenedorEliminar.addComponent(lytBotones);
				lytContenedorEliminar.setComponentAlignment(lytBotones, new Alignment(20));
				btnNegacion.focus();
				lytMascaraEliminar.addComponent(lytContenedorEliminar);
				modalConfimacion.setCloseShortcut(KeyCode.ESCAPE, null);
				modalConfimacion.setContent(lytMascaraEliminar);
				UI.getCurrent().addWindow(modalConfimacion);
			}
		});
		lytBotonAccion.addComponent(btnEditar);
		lytBotonAccion.addComponent(btnEliminar);
	
		return lytBotonAccion;
		
	}
	
	protected void mostrarModal(Component component,String titulo,String alto, String ancho) {
		Window window = new Window();
		window.setStyleName("titulo-bold");
		window.setModal(true);
		window.setResizable(false);
		window.setCaption(titulo);
		VaadinUtil.aplicarReflexionId(window);
		VerticalLayout layout = new VerticalLayout();
		layout.addComponent(component);
		layout.setMargin(false);
		window.setContent(layout);
		window.setHeight(alto);
		window.setWidth(ancho);
		UI.getCurrent().addWindow(window);
	}

	
	protected void mostrarConfirmacion(IConfirmDialog iConfirmDialog){
		ConfirmDialog  confirmDialog=new ConfirmDialog(iConfirmDialog);
		confirmDialog.setMensaje(getMensaje("core.general.mensaje.confirmacion.eliminar"));
		mostrarModal(confirmDialog,"Confirmación","120px","320px");
	}
			
	protected void mostrarConfirmacion(IConfirmDialog iConfirmDialog, String codigoMensaje, Object ... parametro){
		ConfirmDialog  confirmDialog=new ConfirmDialog(iConfirmDialog);
		confirmDialog.setMensaje(getMensaje(codigoMensaje,parametro));
		mostrarModal(confirmDialog,"Confirmación","120px","320px");
	}
	
	protected void mostrarAlerta(IAlertDialog iAlertDialog, String codigoMensaje, Object ... parametro){
		AlertDialog  alertDialog = new AlertDialog(iAlertDialog);
		alertDialog.setMensaje(getMensaje(codigoMensaje,parametro));
		mostrarModal(alertDialog,"Alerta","120px","320px");
	}

	
}
